﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace StateGrid
{
    /*
     * 属性初使化时从配置信息得到枚举值typeNo, validNo, updateNo, controlNo, isKey
     * control最后，因为它要用到其他的属性值
     */
    
    
    /*
     * 该属性的类型，枚举值
     */
    enum attrType
    {
        ETypeVoid = 0,
        ETypeInt,
        ETypeBool,
        ETypeString,
        ETypeText,
        ETypeDate
    }
    /*
     * 该属性的校验方法，枚举值
     */
    enum attrValidation
    {
        EValidNone = 0,
        EValidSpiliter = 1,
        EValidTrim,
        EValidCustom    //自定义校验
    }
    /*
     * 当向数据库更新时，与该属性相关的回调操作，枚举值
     */
    enum attrUpdate
    {
        EUpdateNone = 0,
        EUpdateReplace = 1,
        EUpdateUse,
        EUpdateCustom   //自定义更新回调
    }
    /*
     * 与该属性绑定的界面控件类型，枚举值
     */
    enum attrControl
    {
        EControlNone = 0,   //应该不会发生
        EControlButton,
        EControlTextBox,
        EControlCheckBox,
        EControlPathDialog,
        EControlTextArea
    }


    class CAttribute
    {

        /*
         * 校验操作的委托
         */
        public delegate void validationOP();
        public validationOP doValidation;
        /*
         * 更新数据库回调操作的委托
         */
        public delegate void updateOP();
        public updateOP doUpdate;

#if null
        /*
         * 设置属性类型，同时更新类型变量type
         */
        public attrType typeNo
        {
            set
            {
                _typeNo = value;
                switch (value)
                {
                    case ETypeInt:
                        _type = typeof(int);
                        break;
                    case ETypeBool:
                        _type = typeof(bool);
                        break;
                    case ETypeString:
                    case ETypeText:
                        _type = typeof(string);
                        break;
                    case ETypeDate:
                        _type = typeof(DateTime);
                        break;
                    case ETypeVoid:
                    default:
                        _type = null;
                }
            }
            get
            {
                return _typeNo;
            }
        }
        /*
         * 设置校验类型，并自动更新校验操作委托
         */
        public attrValidation validNo
        {
            set
            {
                _validNo = value;
                doValidation = doNothing;
                switch (value)
                {
                    case EValidNone:
                        break;
                    case EValidSpiliter:
                        doValidation += validOpSpiliter;
                        break;
                    case EValidTrim:
                        doValidation += validOpTrim;
                        break;
                    case EValidCustom:
                        doValidation += validOpCustom;
                        break;
                    default:
                }
            }
            get
            {
                return _validNo;
            }
        }
        /*
         * 设置更新回调类型，并自动更新回调委托
         */
        public attrUpdate updateNo
        {
            set
            {
                _updateNo = value;
                doUpdate = doNothing;
                switch (_updateNo)
                {
                    case EUpdateNone:
                        break;
                    case EUpdateReplace:
                        doUpdate += updateOpReplace;
                        break;
                    case EUpdateUse:
                        doUpdate += updateOpUse;
                        break;
                    case EUpdateCustom:
                        doUpdate += updateOpCustom;
                        break;
                    default:
                }
            }
            get
            {
                return _updateNo;
            }
        }
        /*
         * 设置与该属性绑定的界面控件类型，并自动绑定控件
         */

        public attrControl controlNo
        {
            get
            {
                return _controlNo;
            }
            set
            {
                _controlNo = value;
                switch (_controlNo)
                {
                    case EControlNone:
                        panel = null;
                        break;
                    case EControlButton:
                        panel = new WrapPanel();
                        panel.Children.Add(new Button());
                        //在panel里摆放控件，panel统一宽度
                        //control.Name = title;
                        //可进行其它与control有关的设置
                        break;
                    case EControlTextBox:
                        panel = new WrapPanel();
                        

                        break;

        /*
         * 表示该属性的类型
         */
        public Type type
        {
            set
            {
                _type = value;
            }
            get
            {
                return _type;
            }
        }
        
        /*
         * 与该属性绑定的界面控件
         */
        public Panel panel;     //TODO:在copy meta的时候会不会有问题？
        /*
         * 是否是数据库表的主键
         */
        public bool isKey
        {
            get;
            set;
        }
        /*
         * 该数据在数据库表中的列名
         */
        public string title;
        /*
         * 属性的值
         */
        public object value;
        private Type _type;
        private attrType _typeNo;
        private attrValidation _validNo;
        private attrUpdate _updateNo;
        private attrControl _controlNo;
        
        
        
        
        
        /*
         * 重载toString函数
         */
        public string toString()
        {
            return value.ToString();
        }
        public void doNothing()
        {
        }
        /*
         * 备选校验方法: 统一分隔符为半角分号
         */
        public void validOpSpiliter()
        {
        }
        /*
         * 备选校验方法：去掉前后的空格，非常规字符
         */
        public void validOpTrim()
        {
        }
        /*
         * 自定义校验方法
         */
        public void validOpCustom()
        {
        }
        /*
         * 备选更新回调方法：代替关系更新
         */
        public void updateOpReplace()
        {
        }
        /* 
         * 备选更新回调方法：采用关系更新
         */
        public void updateOpUse()
        {
        }
        /*
         * 自定义更新回调方法
         */
        public void updateOpCustom()
        {
        }
#endif
    }
}
